package org.whh.automatic.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.awt.*;
import java.awt.event.InputEvent;

/**
 * 鼠标操作工具类
 * <p>
 * 提供鼠标移动、单击、双击等基础操作功能，
 * 用于在UI测试或自动化操作中进行鼠标控制。
 */
public class MouseActionUtil {

    /**
     * 日志记录器
     */
    private static final Logger logger = LoggerFactory.getLogger(MouseActionUtil.class);

    /**
     * 移动鼠标到指定坐标
     *
     * @param x X坐标
     * @param y Y坐标
     * @return 是否成功移动，如果Robot实例创建失败则返回false
     */
    public static boolean moveMouseTo(int x, int y) {
        try {
            Robot robot = new Robot();
            robot.mouseMove(x, y);
            logger.info("鼠标已移动到坐标 ({}, {})", x, y);
            return true;
        } catch (AWTException e) {
            logger.error("无法创建Robot实例，鼠标移动失败", e);
            return false;
        }
    }

    /**
     * 在指定坐标执行单击操作
     *
     * @param x X坐标
     * @param y Y坐标
     * @return 是否成功单击，如果Robot实例创建失败则返回false
     */
    public static boolean singleClick(int x, int y) {
        try {
            Robot robot = new Robot();
            robot.mouseMove(x, y);
            robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
            robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
            logger.info("在坐标 ({}, {}) 执行单击操作", x, y);
            return true;
        } catch (AWTException e) {
            logger.error("无法创建Robot实例，单击操作失败", e);
            return false;
        }
    }

    /**
     * 在指定坐标执行双击操作
     *
     * @param x X坐标
     * @param y Y坐标
     * @return 是否成功双击，如果Robot实例创建失败则返回false
     */
    public static boolean doubleClick(int x, int y) {
        try {
            Robot robot = new Robot();
            robot.mouseMove(x, y);

            // 第一次点击
            robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
            robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);

            // 短暂延迟，模拟真实双击
            sleep(50);

            // 第二次点击
            robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
            robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);

            logger.info("在坐标 ({}, {}) 执行双击操作", x, y);
            return true;
        } catch (AWTException e) {
            logger.error("无法创建Robot实例，双击操作失败", e);
            return false;
        }
    }

    /**
     * 在指定坐标执行点击操作，根据isDoubleClick参数决定是单击还是双击
     *
     * @param x             X坐标
     * @param y             Y坐标
     * @param isDoubleClick 是否执行双击操作
     * @return 是否成功执行点击操作
     */
    public static boolean click(int x, int y, boolean isDoubleClick) {
        if (isDoubleClick) {
            return doubleClick(x, y);
        } else {
            return singleClick(x, y);
        }
    }

    /**
     * 线程休眠
     * <p>
     * 用于在操作之间添加延迟，确保操作的稳定性
     * 如果休眠被中断，会重新设置线程的中断状态
     *
     * @param ms 休眠时间（毫秒）
     */
    private static void sleep(int ms) {
        try {
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
} 